home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-06 / charon40.zip / PRT2MAIL.C < prev    next >
Text File  |  1992-03-26  |  5KB  |  188 lines

  1. /* prt2mail translator for use with Charon
  2.     Copyright (C) 1990 Brad K. Clements, Clarkson University
  3.            All Rights Reserved.
  4.     
  5.     converts incoming printouts into mail messages.
  6.  
  7.     Incoming print jobs must be formatted as follows:
  8.  
  9.            Max width, 80 chars
  10.  
  11.            <Header Line>
  12.         From Address    < the text name, the userid is taken from charon >
  13.         Recipients   <one per line>
  14.         <blank line>
  15.         Subject:    Subject text
  16.         The body of the message.
  17.  
  18.         The Header line is as follows
  19.                    $$mailformat1
  20.  
  21. */
  22.  
  23. #include <ctype.h> 
  24. #include <time.h>
  25. #include <string.h>
  26. #ifndef    STANDALONE
  27. #define    STANDALONE    0
  28. #endif
  29. #include "callback.h"
  30. #include "tagvalue.h"
  31.  
  32. char    *stackinfo="$STACKSIZE:4096";
  33. #define    BUFFSIZE    256
  34. #define    MAXTOS        10
  35.  
  36. #if    STANDALONE
  37. #include    <fcntl.h>
  38. #undef    STDIN
  39. #define    STDIN    sin
  40. #endif
  41. int    sin;
  42.  
  43. int
  44. main(int argc, char *argv[])
  45. {
  46.     int     rc;
  47.     unsigned    header_flags;
  48.     char        ibuffer[BUFFSIZE], obuffer[BUFFSIZE], *c;
  49.     char        *inlimit, *outlimit, *outc;
  50.     enum        mode { HEADER, FROM, TO, SUBJECT, DATA } Mode = HEADER;
  51.     int        lastwas_cr = 0, needline = 1;
  52.     int        inbytes;
  53.     long        start = time(NULL);
  54.     long        end;
  55.     char        from[128];
  56.     char        tos[MAXTOS][128];
  57.     int        tocount = 0;
  58.     int        leadingspace = 1;
  59.  
  60. #if    STANDALONE
  61.     sin = open("sample.prt",O_RDONLY|O_BINARY);
  62. #endif
  63.     outlimit = obuffer + BUFFSIZE -2;
  64.     outc = obuffer;
  65.     while(1) {
  66.         /* read one line at a time */
  67.         inbytes = read(STDIN,ibuffer, BUFFSIZE);
  68.         if(inbytes < 1)
  69.             break;
  70.         inlimit = ibuffer + inbytes;
  71.         c = ibuffer;
  72.         while(1) {
  73.             while(needline && c < inlimit && outc < outlimit) {
  74.                        switch (*c) {
  75.  
  76.                            case 13 :
  77.                                lastwas_cr = 1;
  78.                          needline = 0;
  79.                         *outc++ = 0;
  80.                                break;
  81.                     case 10 :
  82.                         if(!lastwas_cr)
  83.                                    needline = 0;
  84.                         lastwas_cr = 0;
  85.                                break;
  86.                     default :
  87.                                lastwas_cr = 0;
  88.                          if(Mode != DATA && leadingspace) {
  89.                                    if(isspace(*c))
  90.                                        break;
  91.                             leadingspace = 0;
  92.                         }
  93.                         *outc++ = *c;
  94.                     }    /* end switch *c */
  95.                 c++;
  96.             }    /* end while c < inlimit */
  97.             if(outc >= outlimit) {
  98.                 fprintf(STDERR,"Warn! Output buffer overflow\n");
  99.             }
  100.             if(!needline) {    /* have some work to do */
  101.                        leadingspace = 1;
  102.                        switch (Mode) {
  103.                      case HEADER :    /* first line is header */
  104.                                if(!strlen(obuffer))
  105.                                    break;        /* skip leading blanks */
  106.                                if(strcmp(obuffer,"$$mailformat1")) {
  107.                             /* bogus */
  108.                             fprintf(STDERR,"Mailformed first line (%s)\n",obuffer);
  109.                              return(RT_FAILED);
  110.                         }
  111.                         Mode = FROM;
  112.                         break;
  113.                      case    FROM :
  114.                         strcpy(from, obuffer);
  115.                          Mode = TO;
  116.                          break;
  117.                     case     TO :
  118.                                if(!strlen(obuffer)) {    /* done */
  119.                              char    tt[36];
  120.                                long    now;
  121.  
  122.                              if(tocount < 1) {
  123.                                 fprintf(STDERR,"No recipients found\n");
  124.                                 return(RT_FAILED);
  125.                              }
  126.                              fprintf(STDOUT,"$$\r\n");
  127.                              for(rc = 0; rc < tocount; rc++)
  128.                                     fprintf(STDOUT,"%s\r\n",tos[rc]);
  129.                              fprintf(STDOUT,"\r\n");
  130.                              fprintf(STDOUT,"From:     %c%s%c <%s",34,from,34,
  131.                                     getenv(TV_SourceObject));
  132.                              fprintf(STDOUT,"@%s>\r\n", getenv(TV_SourceIHost));
  133.                                       /* getenv is simulated with static area..
  134.                                        so you can't call it twice in a row */
  135.                              for(rc = 0; rc < tocount; rc++) {
  136.                                     if(!rc)
  137.                                         fprintf(STDOUT,"To:       %s",tos[0]);
  138.                                     else
  139.                                         fprintf(STDOUT,"%s",tos[rc]);
  140.                                     if(rc+1 < tocount)
  141.                                         fprintf(STDOUT,",\r\n         ");
  142.                              }    /* end for */
  143.                              fprintf(STDOUT,"\r\n");
  144.                              time(&now);
  145.                              strcpy(tt, ctime(&now));
  146.                              tt[3] = 0;
  147.                              tt[7] = 0;
  148.                              tt[0xa] = 0;
  149.                              tt[0x13] = 0;
  150.                              tt[0x18] = 0;
  151.                              fprintf(STDOUT,"Date:     %s %s %s %s\r\n",&tt[8],&tt[4],&tt[0x16],&tt[0xb]);
  152.                              Mode = SUBJECT;
  153.                              sprintf(obuffer,"%s=%s",TV_NextJobTypes, TVJT_MAILER);
  154.                              setenv(obuffer);
  155.                              break;
  156.                             }
  157.                          if(tocount < MAXTOS) {
  158.                                    strcpy(&tos[tocount++][0],obuffer);
  159.                         }
  160.                          else {
  161.                                    fprintf(STDERR,"Max recipients exceeded, discarding: %s\n",obuffer);
  162.                         }
  163.                          break;
  164.                     case    SUBJECT :
  165.                                Mode = DATA;
  166.                          fprintf(STDOUT,"%s\r\n\r\n",obuffer);
  167.                         break;
  168.                     case    DATA :
  169.                                fprintf(STDOUT,"%s\r\n",obuffer);
  170.                 } /* end switch mode */
  171.                 needline = 1;
  172.                  outc = obuffer;
  173.                 }    /* end if !needline */
  174.              if(c >= inlimit) {
  175.                 break;
  176.             }
  177.             }    /* end while 1 (break into lines loop) */
  178.        }    /* end while 1 (main input loop) */
  179.     if(Mode == DATA && outc > obuffer) {
  180.                *outc++ = 0;
  181.          fprintf(STDOUT,"%s\r\n",obuffer);
  182.     }
  183.     time(&end);
  184.     fprintf(STDERR,"Translated %ld input bytes, %ld output bytes in %d seconds\n",tellp(STDIN), tellp(STDOUT), (int) end-start);
  185.     return(RT_OK|RT_CHANGED_TEXT|RT_CHANGED_TAGS);
  186. }
  187.  
  188.